﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;

namespace BLL
{
    public class Falta_BLL
    {
        #region singleton
        private static Falta_BLL instance;

        private Falta_BLL() { }

        public static Falta_BLL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Falta_BLL();
                }
                return instance;
            }
        }
        #endregion


        public void AlterarFalta(int faltaId, int idcliente, string userid, string ip, int id_funcionario, DateTime data_inicio,
             string obs, bool diacompleto, int idempresa, string comprovativo, bool falta_justificada)
        {
            DateTime timestamp = DateTime.Now;
            hrpEntities hrp = new hrpEntities();
            hrp_faltas actualFalta = hrp.hrp_faltas.FirstOrDefault(f => f.id == faltaId && f.id_funcionario == id_funcionario && f.id_cliente == idcliente && f.id_empresa == idempresa);
            CriarLog(hrp, ref actualFalta, userid, "", timestamp);
            actualFalta.comprovativo = comprovativo;
            actualFalta.data_inicio = data_inicio;
            actualFalta.dia_completo = diacompleto;
            actualFalta.falta_justificada = falta_justificada;
            actualFalta.obs = obs;
            actualFalta.user_id = userid;
            actualFalta.user_ip = ip;
            actualFalta.user_timestamp = timestamp;
            hrp.SaveChanges();

        }

        public void CriarLog(hrpEntities hrp, ref hrp_faltas actualFalta, string userId, string userIp, DateTime userTimestamp)
        {
            hrp_faltas_log faltaLog = new hrp_faltas_log();
            faltaLog.activo = actualFalta.activo;
            faltaLog.comprovativo = actualFalta.comprovativo;
            faltaLog.data_inicio = actualFalta.data_inicio;
            faltaLog.dia_completo = actualFalta.dia_completo;
            faltaLog.falta_justificada = actualFalta.falta_justificada;
            faltaLog.id = actualFalta.id;
            faltaLog.id_cliente = actualFalta.id_cliente;
            faltaLog.id_empresa = actualFalta.id_empresa;
            faltaLog.id_funcionario = actualFalta.id_funcionario;
            faltaLog.obs = actualFalta.obs;
            faltaLog.user_id = userId;
            faltaLog.user_ip = userIp;
            faltaLog.user_timestamp = userTimestamp;
            hrp.hrp_faltas_log.Add(faltaLog);

        }

        public bool FaltaExiste(int faltaId, int id_funcionario)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_faltas.Any(f => f.id_funcionario == id_funcionario && f.id == faltaId);
        }
        public int novaFalta(int idcliente, string userid, string ip, int id_funcionario, DateTime data_inicio,
             string obs, bool diacompleto, bool activo, int idempresa, string comprovativo, bool falta_justificada)
        {
            int result = 0;
            try
            {
                hrpEntities hrp = new hrpEntities();
                hrp_faltas novaFalta = new hrp_faltas();
                novaFalta.user_id = userid;
                novaFalta.user_timestamp = DateTime.Now;
                novaFalta.user_ip = ip;
                novaFalta.data_inicio = data_inicio;
                novaFalta.obs = obs;
                novaFalta.comprovativo = comprovativo;
                novaFalta.dia_completo = diacompleto;
                novaFalta.activo = activo;
                novaFalta.id_empresa = idempresa;
                novaFalta.id_cliente = idcliente;
                novaFalta.id_funcionario = id_funcionario;
                novaFalta.falta_justificada = falta_justificada;

                hrp.hrp_faltas.Add(novaFalta);
                hrp.SaveChanges();
                result = 1;
            }
            catch (Exception)
            {

                throw;
            }

            return result;
        }

        public string ObterComprovativoFalta(int id_falta)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_faltas.Where(f => f.id == id_falta).FirstOrDefault().comprovativo;
        }

        public int obterFaltasCompletasFuncionario(int id_funcionario, DateTime datainicio, DateTime datafim, bool faltaJustificada)
        {
            hrpEntities hrp = new hrpEntities();
            var falta = from faltas in hrp.hrp_faltas
                        where faltas.id_funcionario == id_funcionario && faltas.data_inicio >= datainicio
                        && faltas.data_inicio <= datafim && faltas.dia_completo && faltas.falta_justificada == faltaJustificada
                        && faltas.activo
                        select faltas.id;

            int totalFaltas = falta.Count();
            return totalFaltas;
        }

        public int obterFaltasMeiasFuncionario(int id_funcionario, DateTime datainicio, DateTime datafim, bool faltaJustificada)
        {
            hrpEntities hrp = new hrpEntities();
            var falta = from faltas in hrp.hrp_faltas
                        where faltas.id_funcionario == id_funcionario && faltas.data_inicio >= datainicio
                        && faltas.data_inicio <= datafim && !faltas.dia_completo && faltas.falta_justificada == faltaJustificada
                        && faltas.activo
                        select faltas.id;

            int totalFaltas = falta.Count();
            return totalFaltas;
        }


        public void Activar_DesactivarFaltas(int id_faltas)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_faltas falta = hrp.hrp_faltas.FirstOrDefault(f => f.id == id_faltas);
            falta.activo = !falta.activo;
            hrp.SaveChanges();
        }


    }
}
